home *** CD-ROM | disk | FTP | other *** search
/ Workbench Design / WB Collection.iso / workbench werkzeuge / bildschirmschoner / bserver_v1.5 / sources.lha / Sources / lib / libsources / PTPlay.s < prev   
Text File  |  1995-11-08  |  26KB  |  1,272 lines

  1. ;    section text,code
  2.  
  3.     xdef    _pt_InitMusic
  4.     xdef    _pt_PlayMusic
  5.     xdef    _pt_StopMusic
  6.     xdef    _GoPlay
  7.     xdef    _pt_Equilizers
  8.     xdef    _pt_Instruments
  9.     
  10. *****************************************************************
  11. *               »» Protracker 3.00B playroutine ««              *
  12. * Written by Tom "Outland" Bech, Ivar "Heatseeker" J. Olsen,    *
  13. *       and  Bjarte "Krest" Andreassen of Cryptoburners.        *
  14. * Based upon Protracker 1.1A playroutine written by Lars Hamre. *
  15. *          VBlank version. Not optimised in any way.            *
  16. *****************************************************************
  17. * A bit debugged by Stefano "GUNDAM" Reksten of 3AM -           *
  18. * The Three Amigos!!!                                           *
  19. *****************************************************************
  20.  
  21. ; FileFormat offsets
  22. sd_songname    EQU    0    ;songname offset
  23. sd_sampleinfo    EQU    20    ;first sample starts here
  24. sd_numofpatt    EQU    950    ;number of patterns are stored here
  25. sd_pattpos    EQU    952    ;pattern positions table is here
  26. sd_mahokakt    EQU    1080    ;"M.K." :)
  27. sd_patterndata    EQU    1084    ;first pattern starts at this position
  28.  
  29. ; Song offsets. W/L/B means word/longword/byte length.
  30. n_note        EQU    0      ;W
  31. n_cmd        EQU    2      ;W
  32. n_cmdlo        EQU    3      ;low B of cmd
  33. n_start        EQU    4      ;L
  34. n_length    EQU    8      ;W
  35. n_loopstart    EQU    10     ;L
  36. n_replen    EQU    14     ;W
  37. n_period    EQU    16     ;W
  38. n_finetune    EQU    18     ;B
  39. n_volume    EQU    19     ;B
  40. n_dmabit    EQU    20     ;W
  41. n_toneportdirec    EQU    22     ;B
  42. n_toneportspeed    EQU    23     ;B
  43. n_wantedperiod    EQU    24     ;W
  44. n_vibratocmd    EQU    26     ;B
  45. n_vibratopos    EQU    27     ;B
  46. n_tremolocmd    EQU    28     ;B
  47. n_tremolopos    EQU    29     ;B
  48. n_wavecontrol    EQU    30     ;B
  49. n_glissfunk    EQU    31     ;B
  50. n_sampleoffset    EQU    32     ;B
  51. n_pattpos    EQU    33     ;B
  52. n_loopcount    EQU    34     ;B
  53. n_funkoffset    EQU    35     ;B
  54. n_wavestart    EQU    36     ;L
  55. n_reallength    EQU    40     ;W
  56. n_trigger    EQU    42     ;B
  57. n_samplenum    EQU    43     ;B
  58.  
  59. _GoPlay
  60.     movem.l    d0-d7/a0-a6,-(sp)
  61.     jsr    _pt_PlayMusic
  62.     movem.l    (sp)+,d0-d7/a0-a6
  63.     lea    $DFF000,a0
  64.     moveq.l    #0,d0
  65.     rts
  66.  
  67. _pt_InitMusic    ; ( register a0 *module )
  68.     MOVEM.L    D0-D3/A0-A2,-(SP)
  69.     MOVE.W    #330,pt_timeout
  70.     MOVE.L    #0,pt_Counter
  71.     MOVE.L    #6,pt_CurrSpeed
  72.     MOVE.L    #0,pt_PattPos
  73.     MOVE.L    #0,pt_PatternPtr
  74.     MOVE.L    #0,pt_PatternPosition
  75.     MOVE.L    #0,pt_SongPosition
  76.     MOVE.L    #$0600,pt_MetroSpeed
  77.     MOVE.L    #0,pt_PBreakPosition
  78.     MOVE.L    #%1111,pt_PattDelayTime
  79.     MOVE.L    A0,pt_SongDataPtr
  80.     LEA    sd_pattpos(A0),A1
  81.     MOVEQ    #128-1,D0
  82.     MOVEQ    #0,D1
  83.     MOVEQ    #0,D2
  84.     moveq    #$1e,d3
  85. pt_lop2 MOVE.B    (A1)+,D1
  86.     CMP.B    D2,D1
  87.     BLE.B    pt_lop
  88.     MOVE.L    D1,D2
  89. pt_lop    DBRA    D0,pt_lop2
  90.     ADDQ.W    #1,d2
  91.     ASL.L    #8,D2
  92.     ASL.L    #2,D2
  93.     LEA    4(A1,D2.L),A2
  94.     LEA    pt_SampleStarts(PC),A1
  95.     ADD.W    #2*20+2,A0        ;find first sample length
  96.     MOVEQ    #31-1,D0
  97. pt_lop3 MOVE.L    A2,(A1)+
  98.     MOVEQ    #0,D1
  99.     MOVE.W    (A0),D1
  100.     ASL.L    #1,D1
  101.     ADD.L    D1,A2
  102.     ADD.L    D3,A0
  103.     DBRA    D0,pt_lop3
  104.  
  105.     MOVE.B    #6,pt_Speed        ;default speed
  106.     OR.B    #2,$BFE001
  107.     MOVEQ    #0,D0
  108.     LEA    $DFF000,A0
  109.     MOVE.W    D0,$A8(A0)
  110.     MOVE.W    D0,$B8(A0)
  111.     MOVE.W    D0,$C8(A0)
  112.     MOVE.W    D0,$D8(A0)
  113.     CLR.B    pt_SongPos
  114.     CLR.L    pt_Counter
  115.     CLR.W    pt_PattPos
  116.     CLR.L    _pt_Equilizers
  117.     CLR.L    _pt_Instruments
  118.     MOVEM.L    (SP)+,D0-D3/A0-A2
  119.     RTS
  120.  
  121. _pt_StopMusic
  122.     MOVEM.L    D0/A0,-(SP)
  123.     MOVEQ    #0,D0
  124.     LEA    $DFF000,A0
  125.     MOVE.W    D0,$A8(A0)
  126.     MOVE.W    D0,$B8(A0)
  127.     MOVE.W    D0,$C8(A0)
  128.     MOVE.W    D0,$D8(A0)
  129.     MOVE.W    #$000F,$DFF096        ;stop AudioDMA activity
  130.     MOVEM.L    (SP)+,D0/A0
  131.     RTS
  132.  
  133. _pt_PlayMusic
  134.     MOVE.L    pt_SongDataPtr(PC),A0
  135.     ADDQ.L    #1,pt_Counter
  136.     MOVE.L    pt_Counter(PC),D0
  137.     CMP.L    pt_CurrSpeed(PC),D0
  138.     BCS.B    pt_NoNewNote
  139.     CLR.L    pt_Counter
  140.     TST.B    pt_PattDelayTime2
  141.     BEQ.B    pt_GetNewNote
  142.     BSR.B    pt_NoNewAllChannels
  143.     rts
  144.     BRA.W    pt_dskip
  145.  
  146. pt_NoNewNote
  147.     rts
  148.     BSR.B    pt_NoNewAllChannels
  149.     BRA.W    pt_NoNewPositionYet
  150.  
  151. pt_NoNewAllChannels
  152.     rts
  153.     LEA    pt_audchan1temp(PC),A6
  154.     LEA    $DFF0A0,A5
  155.     BSR.W    pt_CheckEffects
  156.     LEA    pt_audchan2temp(PC),A6
  157.     LEA    $DFF0B0,A5
  158.     BSR.W    pt_CheckEffects
  159.     LEA    pt_audchan3temp(PC),A6
  160.     LEA    $DFF0C0,A5
  161.     BSR.W    pt_CheckEffects
  162.     LEA    pt_audchan4temp(PC),A6
  163.     LEA    $DFF0D0,A5
  164.     BRA.W    pt_CheckEffects
  165.  
  166. pt_GetNewNote
  167.     LEA    12(A0),A3
  168.     LEA    sd_pattpos(A0),A2
  169.     LEA    sd_patterndata(A0),A0
  170.     MOVEQ    #0,D1
  171.     MOVE.L    pt_SongPosition(PC),D0
  172.     MOVE.B    0(a2,D0.W),D1
  173.     ASL.L    #8,D1                ;*1024
  174.     ASL.L    #2,D1
  175.  
  176.     ADD.L    pt_PatternPosition(PC),D1
  177.     MOVE.L    D1,pt_PatternPtr
  178.     CLR.W    pt_DMACONtemp
  179.     LEA    $DFF0A0,A5
  180.     LEA    pt_audchan1temp(PC),A6
  181.     MOVEQ    #1,D2
  182.     MOVEQ    #0,D3
  183.     BSR.W    pt_PlayVoice
  184.     MOVEQ    #0,D0
  185.     MOVE.B    n_volume(A6),D0
  186.     MOVE.W    D0,8(A5)
  187.     LEA    $DFF0B0,A5
  188.     LEA    pt_audchan2temp(PC),A6
  189.     MOVEQ    #2,D2
  190.     MOVEQ    #1,D3
  191.     BSR.B    pt_PlayVoice
  192.     MOVEQ    #0,D0
  193.     MOVE.B    n_volume(A6),D0
  194.     MOVE.W    D0,8(A5)
  195.     LEA    $DFF0C0,A5
  196.     LEA    pt_audchan3temp(PC),A6
  197.     MOVEQ    #3,D2
  198.     MOVEQ    #2,D3
  199.     BSR.B    pt_PlayVoice
  200.     MOVEQ    #0,D0
  201.     MOVE.B    n_volume(A6),D0
  202.     MOVE.W    D0,8(A5)
  203.     LEA    $DFF0D0,A5
  204.     LEA    pt_audchan4temp(PC),A6
  205.     MOVEQ    #4,D2
  206.     MOVEQ    #3,D3
  207.     BSR.B    pt_PlayVoice
  208.     MOVEQ    #0,D0
  209.     MOVE.B    n_volume(A6),D0
  210.     MOVE.W    D0,8(A5)
  211.     BRA.W    pt_SetDMA
  212.  
  213. pt_CheckMetronome
  214.     CMP.B    pt_MetroChannel,D2
  215.     BNE.W    pt_Return
  216.     MOVE.B    pt_MetroSpeed,D2
  217.     BEQ.W    pt_Return
  218.     MOVE.L    pt_PatternPosition,D3
  219.     LSR.L    #4,D3
  220.     DIVU    D2,D3
  221.     SWAP    D3
  222.     TST.W    D3
  223.     BNE.W    pt_Return
  224.     AND.L    #$00000FFF,(A6)
  225.     OR.L    #$10D6F000,(A6)     ;Play sample $1F at period $0D6 (214)
  226.     RTS
  227.  
  228. pt_PlayVoice
  229.     TST.L    (A6)
  230.     BNE.B    pt_plvskip
  231.     BSR.W    pt_PerNop
  232. pt_plvskip
  233.     MOVE.L    0(a0,D1.L),(A6)        ;Read one track from pattern
  234.     BSR.B    pt_CheckMetronome
  235.     ADDQ.L    #4,D1
  236.     MOVEQ    #0,D2
  237.     MOVE.B    n_cmd(A6),D2        ;Get lower 4 bits of instrument
  238.     AND.B    #$F0,D2
  239.     LSR.B    #4,D2
  240.     MOVE.B    (A6),D0            ;Get higher 4 bits of instrument
  241.     AND.B    #$F0,D0
  242.     OR.B    D0,D2
  243.     TST.B    D2
  244.     BEQ.W    pt_SetRegisters        ;Instrument was zero
  245.     LEA    _pt_Equilizers(PC),A1
  246.     MOVE.B    D2,4(A1,D3)        ;Store current Instrument
  247.     MOVE.B    #0,0(A1,D3)        ;Reset equilizer
  248.     LEA    pt_SampleStarts(PC),A1
  249.     MOVE    D2,D4
  250.     MOVE.B    D2,n_samplenum(A6)
  251.     SUBQ.L    #1,D2
  252.     LSL.L    #2,D2
  253.     MULU    #30,D4
  254.     MOVE.L    0(a1,D2.L),n_start(A6)
  255.     MOVE.W    0(a3,D4.L),n_length(A6)
  256.     MOVE.W    0(a3,D4.L),n_reallength(A6)
  257.     MOVE.B    2(A3,D4.L),n_finetune(A6)
  258.     MOVE.B    3(A3,D4.L),n_volume(A6)
  259.     MOVE.W    4(A3,D4.L),D3         ;Get repeat
  260.     TST.W    D3
  261.     BEQ.B    pt_NoLoop
  262.     MOVE.L    n_start(A6),D2        ;Get start
  263.     ASL.W    #1,D3
  264.     ADD.L    D3,D2            ;Add repeat
  265.     MOVE.L    D2,n_loopstart(A6)
  266.     MOVE.L    D2,n_wavestart(A6)
  267.     MOVE.W    4(A3,D4.L),D0        ;Get repeat
  268.     ADD.W    6(A3,D4.L),D0        ;Add replen
  269.     MOVE.W    D0,n_length(A6)
  270.     MOVE.W    6(A3,D4.L),n_replen(A6)    ;Save replen
  271.     BRA.B    pt_SetRegisters
  272.  
  273. pt_NoLoop
  274.     MOVE.L    n_start(A6),D2
  275.     ADD.L    D3,D2
  276.     MOVE.L    D2,n_loopstart(A6)
  277.     MOVE.L    D2,n_wavestart(A6)
  278.     MOVE.W    6(A3,D4.L),n_replen(A6)    ;Save replen
  279. pt_SetRegisters
  280.     MOVE.W    (A6),D0
  281.     AND.W    #$0FFF,D0
  282.     BEQ.W    pt_CheckMoreEffects    ;If no note ->
  283.     MOVE.W    2(A6),D0
  284.     AND.W    #$0FF0,D0
  285.     CMP.W    #$0E50,D0         ;finetune?
  286.     BEQ.B    pt_DoSetFineTune
  287.     MOVE.B    2(A6),D0
  288.     AND.B    #$0F,D0
  289.     CMP.B    #3,D0            ;TonePortamento?
  290.     BEQ.B    pt_ChkTonePorta
  291.     CMP.B    #5,D0            ;TonePortamento + VolSlide?
  292.     BEQ.B    pt_ChkTonePorta
  293.     CMP.B    #9,D0            ;Sample Offset?
  294.     BNE.B    pt_SetPeriod
  295.     BSR.W    pt_CheckMoreEffects
  296.     BRA.B    pt_SetPeriod
  297.  
  298. pt_DoSetFineTune
  299.     BSR.W    pt_SetFineTune
  300.     BRA.B    pt_SetPeriod
  301.  
  302. pt_ChkTonePorta
  303.     BSR.W    pt_SetTonePorta
  304.     BRA.W    pt_CheckMoreEffects
  305.  
  306. pt_SetPeriod
  307.     MOVEM.L    D0-D1/A0-A1,-(SP)
  308.     MOVE.W    (A6),D1
  309.     AND.W    #$0FFF,D1
  310.     LEA    pt_PeriodTable(PC),A1
  311.     MOVEQ    #0,D0
  312.     MOVEQ    #$24,D7
  313. pt_ftuloop
  314.     CMP.W    0(a1,D0.W),D1
  315.     BHS.B    pt_ftufound
  316.     ADDQ.L    #2,D0
  317.     DBRA    D7,pt_ftuloop
  318. pt_ftufound
  319.     MOVEQ    #0,D1
  320.     MOVE.B    n_finetune(A6),D1
  321.     MULU    #37*2,D1
  322.     ADD.L    D1,A1
  323.     MOVE.W    0(a1,D0.W),n_period(A6)
  324.     MOVEM.L    (SP)+,D0-D1/A0-A1
  325.  
  326.     MOVE.W    2(A6),D0
  327.     AND.W    #$0FF0,D0
  328.     CMP.W    #$0ED0,D0
  329.     BEQ.W    pt_CheckMoreEffects
  330.  
  331.     MOVE.W    n_dmabit(A6),$DFF096
  332.     BTST    #2,n_wavecontrol(A6)
  333.     BNE.B    pt_vibnoc
  334.     CLR.B    n_vibratopos(A6)
  335. pt_vibnoc
  336.     BTST    #6,n_wavecontrol(A6)
  337.     BNE.B    pt_trenoc
  338.     CLR.B    n_tremolopos(A6)
  339. pt_trenoc
  340.     MOVE.W    n_length(A6),4(A5)    ;Set length
  341.     MOVE.L    n_start(A6),(A5)    ;Set start
  342.     BNE.B    pt_sdmaskp
  343.     CLR.L    n_loopstart(A6)
  344.     MOVEQ    #1,D0
  345.     MOVE.W    D0,4(A5)
  346.     MOVE.W    D0,n_replen(A6)
  347. pt_sdmaskp
  348.     MOVE.W    n_period(A6),D0
  349.     MOVE.W    D0,6(A5)        ;Set period
  350.     ST    n_trigger(A6)
  351.     MOVE.W    n_dmabit(A6),D0
  352.     OR.W    D0,pt_DMACONtemp
  353.     BRA.W    pt_CheckMoreEffects
  354.  
  355.  
  356. pt_SetDMA
  357.     MOVE.W    pt_timeout,D0
  358. pt_WaitDMA
  359.     DBRA    D0,pt_WaitDMA           ; It's OK since this code is placed in
  360.     MOVE.W    pt_DMACONtemp(PC),D0    ; CHIP memory :-)
  361.     AND.W    pt_ActiveChannels,D0    ; (It would be a hell of a work to
  362.     OR.W    #$8000,D0               ; multitask correctly and preserving
  363.     MOVE.W    D0,$DFF096              ; CIA registers!!!
  364.     MOVE.W    pt_timeout,D0
  365. pt_WaitDMA2
  366.     DBRA    D0,pt_WaitDMA2
  367.  
  368.     LEA    $DFF000,A5
  369.     LEA    pt_audchan4temp(PC),A6
  370.     MOVE.L    n_loopstart(A6),$D0(A5)
  371.     MOVE.W    n_replen(A6),$D4(A5)
  372.     LEA    pt_audchan3temp(PC),A6
  373.     MOVE.L    n_loopstart(A6),$C0(A5)
  374.     MOVE.W    n_replen(A6),$C4(A5)
  375.     LEA    pt_audchan2temp(PC),A6
  376.     MOVE.L    n_loopstart(A6),$B0(A5)
  377.     MOVE.W    n_replen(A6),$B4(A5)
  378.     LEA    pt_audchan1temp(PC),A6
  379.     MOVE.L    n_loopstart(A6),$A0(A5)
  380.     MOVE.W    n_replen(A6),$A4(A5)
  381.  
  382. pt_dskip
  383.     ADD.L    #16,pt_PatternPosition
  384.     MOVE.B    pt_PattDelayTime,D0
  385.     BEQ.B    pt_dskpc
  386.     MOVE.B    D0,pt_PattDelayTime2
  387.     CLR.B    pt_PattDelayTime
  388. pt_dskpc
  389.     TST.B    pt_PattDelayTime2
  390.     BEQ.B    pt_dskpa
  391.     SUBQ.B    #1,pt_PattDelayTime2
  392.     BEQ.B    pt_dskpa
  393.     SUB.L    #16,pt_PatternPosition
  394. pt_dskpa
  395.     TST.B    pt_PBreakFlag
  396.     BEQ.B    pt_nnpysk
  397.     SF    pt_PBreakFlag
  398.     MOVEQ    #0,D0
  399.     MOVE.B    pt_PBreakPosition(PC),D0
  400.     LSL.W    #4,D0
  401.     MOVE.L    D0,pt_PatternPosition
  402.     CLR.B    pt_PBreakPosition
  403. pt_nnpysk
  404.     CMP.L    #1024,pt_PatternPosition
  405.     BNE.B    pt_NoNewPositionYet
  406. pt_NextPosition    
  407.     MOVEQ    #0,D0
  408.     MOVE.B    pt_PBreakPosition(PC),D0
  409.     LSL.W    #4,D0
  410.     MOVE.L    D0,pt_PatternPosition
  411.     CLR.B    pt_PBreakPosition
  412.     CLR.B    pt_PosJumpAssert
  413.     ADDQ.L    #1,pt_SongPosition
  414.     AND.L    #$7F,pt_SongPosition
  415.     MOVE.L    pt_SongPosition(PC),D1
  416.     MOVE.L    pt_SongDataPtr(PC),A0
  417.     CMP.B    sd_numofpatt(A0),D1
  418.     BLO.B    pt_NoNewPositionYet
  419.     CLR.L    pt_SongPosition
  420. pt_NoNewPositionYet
  421.     TST.B    pt_PosJumpAssert
  422.     BNE.B    pt_NextPosition
  423.     RTS
  424.  
  425. pt_CheckEffects
  426.     BSR.B    pt_chkefx2
  427.     MOVEQ    #0,D0
  428.     MOVE.B    n_volume(A6),D0
  429.     MOVE.W    D0,8(A5)
  430.     RTS
  431.  
  432. pt_chkefx2
  433.     BSR.W    pt_UpdateFunk
  434.     MOVE.W    n_cmd(A6),D0
  435.     AND.W    #$0FFF,D0
  436.     BEQ.B    pt_Return
  437.     MOVE.B    n_cmd(A6),D0
  438.     AND.B    #$0F,D0
  439.     TST.B    D0
  440.     BEQ.B    pt_Arpeggio
  441.     CMP.B    #1,D0
  442.     BEQ.W    pt_PortaUp
  443.     CMP.B    #2,D0
  444.     BEQ.W    pt_PortaDown
  445.     CMP.B    #3,D0
  446.     BEQ.W    pt_TonePortamento
  447.     CMP.B    #4,D0
  448.     BEQ.W    pt_Vibrato
  449.     CMP.B    #5,D0
  450.     BEQ.W    pt_TonePlusVolSlide
  451.     CMP.B    #6,D0
  452.     BEQ.W    pt_VibratoPlusVolSlide
  453.     CMP.B    #$E,D0
  454.     BEQ.W    pt_ECommands
  455. pt_SetBack
  456.     MOVE.W    n_period(A6),6(A5)
  457.     CMP.B    #7,D0
  458.     BEQ.W    pt_Tremolo
  459.     CMP.B    #$A,D0
  460.     BEQ.W    pt_VolumeSlide
  461. pt_Return
  462.     RTS
  463.  
  464. pt_PerNop
  465.     MOVE.W    n_period(A6),6(A5)
  466.     RTS
  467.  
  468. pt_Arpeggio
  469.     MOVEQ    #0,D0
  470.     MOVE.L    pt_Counter(PC),D0
  471.     DIVS    #3,D0
  472.     SWAP    D0
  473.     CMP.W    #1,D0
  474.     BEQ.B    pt_Arpeggio1
  475.     CMP.W    #2,D0
  476.     BEQ.B    pt_Arpeggio2
  477. pt_Arpeggio0
  478.     MOVE.W    n_period(A6),D2
  479.     BRA.B    pt_ArpeggioSet
  480.  
  481. pt_Arpeggio1
  482.     MOVEQ    #0,D0
  483.     MOVE.B    n_cmdlo(A6),D0
  484.     LSR.B    #4,D0
  485.     BRA.B    pt_ArpeggioFind
  486.  
  487. pt_Arpeggio2
  488.     MOVEQ    #0,D0
  489.     MOVE.B    n_cmdlo(A6),D0
  490.     AND.B    #15,D0
  491. pt_ArpeggioFind
  492.     ASL.W    #1,D0
  493.     MOVEQ    #0,D1
  494.     MOVE.B    n_finetune(A6),D1
  495.     MULU    #37*2,D1
  496.     LEA    pt_PeriodTable(PC),A0
  497.     ADD.L    D1,A0
  498.     MOVEQ    #0,D1
  499.     MOVE.W    n_period(A6),D1
  500.     MOVEQ    #$24,D7
  501. pt_arploop
  502.     MOVE.W    0(a0,D0.W),D2
  503.     CMP.W    (A0),D1
  504.     BHS.B    pt_ArpeggioSet
  505.     ADDQ.L    #2,A0
  506.     DBRA    D7,pt_arploop
  507.     RTS
  508.  
  509. pt_ArpeggioSet
  510.     MOVE.W    D2,6(A5)
  511.     RTS
  512.  
  513. pt_FinePortaUp
  514.     TST.L    pt_Counter
  515.     BNE.B    pt_Return
  516.     MOVE.B    #$0F,pt_LowMask
  517. pt_PortaUp
  518.     MOVEQ    #0,D0
  519.     MOVE.B    n_cmdlo(A6),D0
  520.     AND.B    pt_LowMask,D0
  521.     MOVE.B    #$FF,pt_LowMask
  522.     SUB.W    D0,n_period(A6)
  523.     MOVE.W    n_period(A6),D0
  524.     AND.W    #$0FFF,D0
  525.     CMP.W    #$0071,D0
  526.     BPL.B    pt_PortaUskip
  527.     AND.W    #$F000,n_period(A6)
  528.     OR.W    #$0071,n_period(A6)
  529. pt_PortaUskip
  530.     MOVE.W    n_period(A6),D0
  531.     AND.W    #$0FFF,D0
  532.     MOVE.W    D0,6(A5)
  533.     RTS
  534.  
  535. pt_FinePortaDown
  536.     TST.L    pt_Counter
  537.     BNE.W    pt_Return
  538.     MOVE.B    #$0F,pt_LowMask
  539. pt_PortaDown
  540.     CLR.W    D0
  541.     MOVE.B    n_cmdlo(A6),D0
  542.     AND.B    pt_LowMask,D0
  543.     MOVE.B    #$FF,pt_LowMask
  544.     ADD.W    D0,n_period(A6)
  545.     MOVE.W    n_period(A6),D0
  546.     AND.W    #$0FFF,D0
  547.     CMP.W    #$0358,D0
  548.     BMI.B    pt_Portadskip
  549.     AND.W    #$F000,n_period(A6)
  550.     OR.W    #$0358,n_period(A6)
  551. pt_Portadskip
  552.     MOVE.W    n_period(A6),D0
  553.     AND.W    #$0FFF,D0
  554.     MOVE.W    D0,6(A5)
  555.     RTS
  556.  
  557. pt_SetTonePorta
  558.     MOVE.L    A0,-(SP)
  559.     MOVE.W    (A6),D2
  560.     AND.W    #$0FFF,D2
  561.     MOVEQ    #0,D0
  562.     MOVE.B    n_finetune(A6),D0
  563.     MULU    #37*2,D0
  564.     LEA    pt_PeriodTable(PC),A0
  565.     ADD.L    D0,A0
  566.     MOVEQ    #0,D0
  567. pt_StpLoop
  568.     CMP.W    0(a0,D0.W),D2
  569.     BHS.B    pt_StpFound
  570.     ADDQ.W    #2,D0
  571.     CMP.W    #37*2,D0
  572.     BLO.B    pt_StpLoop
  573.     MOVEQ    #35*2,D0
  574. pt_StpFound
  575.     MOVE.B    n_finetune(A6),D2
  576.     AND.B    #8,D2
  577.     BEQ.B    pt_StpGoss
  578.     TST.W    D0
  579.     BEQ.B    pt_StpGoss
  580.     SUBQ.W    #2,D0
  581. pt_StpGoss
  582.     MOVE.W    0(a0,D0.W),D2
  583.     MOVE.L    (SP)+,A0
  584.     MOVE.W    D2,n_wantedperiod(A6)
  585.     MOVE.W    n_period(A6),D0
  586.     CLR.B    n_toneportdirec(A6)
  587.     CMP.W    D0,D2
  588.     BEQ.B    pt_ClearTonePorta
  589.     BGE.W    pt_Return
  590.     MOVE.B    #1,n_toneportdirec(A6)
  591.     RTS
  592.  
  593. pt_ClearTonePorta
  594.     CLR.W    n_wantedperiod(A6)
  595.     RTS    
  596.  
  597. pt_TonePortamento
  598.     MOVE.B    n_cmdlo(A6),D0
  599.     BEQ.B    pt_TonePortNoChange
  600.     MOVE.B    D0,n_toneportspeed(A6)
  601.     CLR.B    n_cmdlo(A6)
  602. pt_TonePortNoChange
  603.     TST.W    n_wantedperiod(A6)
  604.     BEQ.W    pt_Return
  605.     MOVEQ    #0,D0
  606.     MOVE.B    n_toneportspeed(A6),D0
  607.     TST.B    n_toneportdirec(A6)
  608.     BNE.B    pt_TonePortaUp
  609. pt_TonePortaDown
  610.     ADD.W    D0,n_period(A6)
  611.     MOVE.W    n_wantedperiod(A6),D0
  612.     CMP.W    n_period(A6),D0
  613.     BGT.B    pt_TonePortaSetPer
  614.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  615.     CLR.W    n_wantedperiod(A6)
  616.     BRA.B    pt_TonePortaSetPer
  617.  
  618. pt_TonePortaUp
  619.     SUB.W    D0,n_period(A6)
  620.     MOVE.W    n_wantedperiod(A6),D0
  621.     CMP.W    n_period(A6),D0
  622.     BLT.B    pt_TonePortaSetPer
  623.     MOVE.W    n_wantedperiod(A6),n_period(A6)
  624.     CLR.W    n_wantedperiod(A6)
  625.  
  626. pt_TonePortaSetPer
  627.     MOVE.W    n_period(A6),D2
  628.     MOVE.B    n_glissfunk(A6),D0
  629.     AND.B    #$0F,D0
  630.     BEQ.B    pt_GlissSkip
  631.     MOVEQ    #0,D0
  632.     MOVE.B    n_finetune(A6),D0
  633.     MULU    #37*2,D0
  634.     LEA    pt_PeriodTable(PC),A0
  635.     ADD.L    D0,A0
  636.     MOVEQ    #0,D0
  637. pt_GlissLoop
  638.     CMP.W    0(a0,D0.W),D2
  639.     BHS.B    pt_GlissFound
  640.     ADDQ.W    #2,D0
  641.     CMP.W    #37*2,D0
  642.     BLO.B    pt_GlissLoop
  643.     MOVEQ    #35*2,D0
  644. pt_GlissFound
  645.     MOVE.W    0(a0,D0.W),D2
  646. pt_GlissSkip
  647.     MOVE.W    D2,6(A5)         ;Set period
  648.     RTS
  649.  
  650. pt_Vibrato
  651.     MOVE.B    n_cmdlo(A6),D0
  652.     BEQ.B    pt_Vibrato2
  653.     MOVE.B    n_vibratocmd(A6),D2
  654.     AND.B    #$0F,D0
  655.     BEQ.B    pt_vibskip
  656.     AND.B    #$F0,D2
  657.     OR.B    D0,D2
  658. pt_vibskip
  659.     MOVE.B    n_cmdlo(A6),D0
  660.     AND.B    #$F0,D0
  661.     BEQ.B    pt_vibskip2
  662.     AND.B    #$0F,D2
  663.     OR.B    D0,D2
  664. pt_vibskip2
  665.     MOVE.B    D2,n_vibratocmd(A6)
  666. pt_Vibrato2
  667.     MOVE.L    A4,-(SP)
  668.     MOVE.B    n_vibratopos(A6),D0
  669.     LEA    pt_VibratoTable(PC),A4
  670.     LSR.W    #2,D0
  671.     AND.W    #$001F,D0
  672.     MOVEQ    #0,D2
  673.     MOVE.B    n_wavecontrol(A6),D2
  674.     AND.B    #$03,D2
  675.     BEQ.B    pt_vib_sine
  676.     LSL.B    #3,D0
  677.     CMP.B    #1,D2
  678.     BEQ.B    pt_vib_rampdown
  679.     MOVE.B    #255,D2
  680.     BRA.B    pt_vib_set
  681. pt_vib_rampdown
  682.     TST.B    n_vibratopos(A6)
  683.     BPL.B    pt_vib_rampdown2
  684.     MOVE.B    #255,D2
  685.     SUB.B    D0,D2
  686.     BRA.B    pt_vib_set
  687. pt_vib_rampdown2
  688.     MOVE.B    D0,D2
  689.     BRA.B    pt_vib_set
  690. pt_vib_sine
  691.     MOVE.B    0(A4,D0.W),D2
  692. pt_vib_set
  693.     MOVE.B    n_vibratocmd(A6),D0
  694.     AND.W    #15,D0
  695.     MULU    D0,D2
  696.     LSR.W    #7,D2
  697.     MOVE.W    n_period(A6),D0
  698.     TST.B    n_vibratopos(A6)
  699.     BMI.B    pt_VibratoNeg
  700.     ADD.W    D2,D0
  701.     BRA.B    pt_Vibrato3
  702. pt_VibratoNeg
  703.     SUB.W    D2,D0
  704. pt_Vibrato3
  705.     MOVE.W    D0,6(A5)
  706.     MOVE.B    n_vibratocmd(A6),D0
  707.     LSR.W    #2,D0
  708.     AND.W    #$003C,D0
  709.     ADD.B    D0,n_vibratopos(A6)
  710.     MOVE.L    (SP)+,A4
  711.     RTS
  712.  
  713. pt_TonePlusVolSlide
  714.     BSR.W    pt_TonePortNoChange
  715.     BRA.W    pt_VolumeSlide
  716.  
  717. pt_VibratoPlusVolSlide
  718.     BSR.B    pt_Vibrato2
  719.     BRA.W    pt_VolumeSlide
  720.  
  721. pt_Tremolo
  722.     MOVE.L    A4,-(SP)
  723.     MOVE.B    n_cmdlo(A6),D0
  724.     BEQ.B    pt_Tremolo2
  725.     MOVE.B    n_tremolocmd(A6),D2
  726.     AND.B    #$0F,D0
  727.     BEQ.B    pt_treskip
  728.     AND.B    #$F0,D2
  729.     OR.B    D0,D2
  730. pt_treskip
  731.     MOVE.B    n_cmdlo(A6),D0
  732.     AND.B    #$F0,D0
  733.     BEQ.B    pt_treskip2
  734.     AND.B    #$0F,D2
  735.     OR.B    D0,D2
  736. pt_treskip2
  737.     MOVE.B    D2,n_tremolocmd(A6)
  738. pt_Tremolo2
  739.     MOVE.B    n_tremolopos(A6),D0
  740.     LEA    pt_VibratoTable(PC),A4
  741.     LSR.W    #2,D0
  742.     AND.W    #$001F,D0
  743.     MOVEQ    #0,D2
  744.     MOVE.B    n_wavecontrol(A6),D2
  745.     LSR.B    #4,D2
  746.     AND.B    #$03,D2
  747.     BEQ.B    pt_tre_sine
  748.     LSL.B    #3,D0
  749.     CMP.B    #1,D2
  750.     BEQ.B    pt_tre_rampdown
  751.     MOVE.B    #255,D2
  752.     BRA.B    pt_tre_set
  753. pt_tre_rampdown
  754.     TST.B    n_vibratopos(A6)
  755.     BPL.B    pt_tre_rampdown2
  756.     MOVE.B    #255,D2
  757.     SUB.B    D0,D2
  758.     BRA.B    pt_tre_set
  759. pt_tre_rampdown2
  760.     MOVE.B    D0,D2
  761.     BRA.B    pt_tre_set
  762. pt_tre_sine
  763.     MOVE.B    0(A4,D0.W),D2
  764. pt_tre_set
  765.     MOVE.B    n_tremolocmd(A6),D0
  766.     AND.W    #15,D0
  767.     MULU    D0,D2
  768.     LSR.W    #6,D2
  769.     MOVEQ    #0,D0
  770.     MOVE.B    n_volume(A6),D0
  771.     TST.B    n_tremolopos(A6)
  772.     BMI.B    pt_TremoloNeg
  773.     ADD.W    D2,D0
  774.     BRA.B    pt_Tremolo3
  775. pt_TremoloNeg
  776.     SUB.W    D2,D0
  777. pt_Tremolo3
  778.     BPL.B    pt_TremoloSkip
  779.     CLR.W    D0
  780. pt_TremoloSkip
  781.     CMP.W    #$40,D0
  782.     BLS.B    pt_TremoloOk
  783.     MOVE.W    #$40,D0
  784. pt_TremoloOk
  785.     MOVE.W    D0,8(A5)
  786.     MOVE.B    n_tremolocmd(A6),D0
  787.     LSR.W    #2,D0
  788.     AND.W    #$003C,D0
  789.     ADD.B    D0,n_tremolopos(A6)
  790.     MOVE.L    (SP)+,A4
  791.     ADDQ.L    #4,SP
  792.     RTS
  793.  
  794. pt_SampleOffset
  795.     MOVEQ    #0,D0
  796.     MOVE.B    n_cmdlo(A6),D0
  797.     BEQ.B    pt_sononew
  798.     MOVE.B    D0,n_sampleoffset(A6)
  799. pt_sononew
  800.     MOVE.B    n_sampleoffset(A6),D0
  801.     LSL.W    #7,D0
  802.     CMP.W    n_length(A6),D0
  803.     BGE.B    pt_sofskip
  804.     SUB.W    D0,n_length(A6)
  805.     LSL.W    #1,D0
  806.     ADD.L    D0,n_start(A6)
  807.     RTS
  808. pt_sofskip
  809.     MOVE.W    #1,n_length(A6)
  810.     RTS
  811.  
  812. pt_VolumeSlide
  813.     MOVEQ    #0,D0
  814.     MOVE.B    n_cmdlo(A6),D0
  815.     LSR.B    #4,D0
  816.     TST.B    D0
  817.     BEQ.B    pt_VolSlideDown
  818. pt_VolSlideUp
  819.     ADD.B    D0,n_volume(A6)
  820.     CMP.B    #$40,n_volume(A6)
  821.     BMI.B    pt_vsuskip
  822.     MOVE.B    #$40,n_volume(A6)
  823. pt_vsuskip
  824.     MOVE.B    n_volume(A6),D0
  825.     RTS
  826.  
  827. pt_VolSlideDown
  828.     MOVEQ    #0,D0
  829.     MOVE.B    n_cmdlo(A6),D0
  830.     AND.B    #$0F,D0
  831. pt_VolSlideDown2
  832.     SUB.B    D0,n_volume(A6)
  833.     BPL.B    pt_vsdskip
  834.     CLR.B    n_volume(A6)
  835. pt_vsdskip
  836.     MOVE.B    n_volume(A6),D0
  837.     RTS
  838.  
  839. pt_PositionJump
  840.     MOVEQ    #0,D0
  841.     MOVE.B    n_cmdlo(A6),D0
  842.     SUBQ.B    #1,D0
  843.     MOVE.L    D0,pt_SongPosition
  844. pt_pj2    CLR.B    pt_PBreakPosition
  845.     ST     pt_PosJumpAssert
  846.     RTS
  847.  
  848. pt_VolumeChange
  849.     MOVEQ    #0,D0
  850.     MOVE.B    n_cmdlo(A6),D0
  851.     CMP.B    #$40,D0
  852.     BLS.B    pt_VolumeOk
  853.     MOVEQ    #$40,D0
  854. pt_VolumeOk
  855.     MOVE.B    D0,n_volume(A6)
  856.     RTS
  857.  
  858. pt_PatternBreak
  859.     MOVEQ    #0,D0
  860.     MOVE.B    n_cmdlo(A6),D0
  861.     MOVE.L    D0,D2
  862.     LSR.B    #4,D0
  863.     MULU    #10,D0
  864.     AND.B    #$0F,D2
  865.     ADD.B    D2,D0
  866.     CMP.B    #63,D0
  867.     BHI.B    pt_pj2
  868.     MOVE.B    D0,pt_PBreakPosition
  869.     ST    pt_PosJumpAssert
  870.     RTS
  871.  
  872. pt_SetSpeed
  873.     MOVE.B    3(A6),D0
  874.     AND.W    #$FF,D0
  875.     BEQ.B    pt_SpeedNull
  876. pt_normspd
  877.     CLR.L    pt_Counter
  878.     MOVE.W    D0,pt_CurrSpeed+2
  879.     RTS
  880. pt_SpeedNull
  881.     RTS
  882.  
  883. pt_CheckMoreEffects
  884.     MOVE.B    2(A6),D0
  885.     AND.B    #$0F,D0
  886.     CMP.B    #$9,D0
  887.     BEQ.W    pt_SampleOffset
  888.     CMP.B    #$B,D0
  889.     BEQ.W    pt_PositionJump
  890.     CMP.B    #$D,D0
  891.     BEQ.B    pt_PatternBreak
  892.     CMP.B    #$E,D0
  893.     BEQ.B    pt_ECommands
  894.     CMP.B    #$F,D0
  895.     BEQ.B    pt_SetSpeed
  896.     CMP.B    #$C,D0
  897.     BEQ.W    pt_VolumeChange
  898.     BRA.W    pt_PerNop
  899.  
  900. pt_ECommands
  901.     MOVE.B    n_cmdlo(A6),D0
  902.     AND.B    #$F0,D0
  903.     LSR.B    #4,D0
  904.     BEQ.B    pt_FilterOnOff
  905.     CMP.B    #1,D0
  906.     BEQ.W    pt_FinePortaUp
  907.     CMP.B    #2,D0
  908.     BEQ.W    pt_FinePortaDown
  909.     CMP.B    #3,D0
  910.     BEQ.B    pt_SetGlissControl
  911.     CMP.B    #4,D0
  912.     BEQ.W    pt_SetVibratoControl
  913.     CMP.B    #5,D0
  914.     BEQ.W    pt_SetFineTune
  915.     CMP.B    #6,D0
  916.     BEQ.W    pt_JumpLoop
  917.     CMP.B    #7,D0
  918.     BEQ.W    pt_SetTremoloControl
  919.     CMP.B    #8,D0
  920.     BEQ.W    pt_KarplusStrong
  921.     CMP.B    #$E,D0
  922.     BEQ.W    pt_PatternDelay
  923.     CMP.B    #9,D0
  924.     BEQ.W    pt_RetrigNote
  925.     CMP.B    #$A,D0
  926.     BEQ.W    pt_VolumeFineUp
  927.     CMP.B    #$B,D0
  928.     BEQ.W    pt_VolumeFineDown
  929.     CMP.B    #$C,D0
  930.     BEQ.W    pt_NoteCut
  931.     CMP.B    #$D,D0
  932.     BEQ.W    pt_NoteDelay
  933.     CMP.B    #$F,D0
  934.     BEQ.W    pt_FunkIt
  935.     RTS
  936.  
  937. pt_FilterOnOff
  938.     MOVE.B    n_cmdlo(A6),D0
  939.     AND.B    #1,D0
  940.     ASL.B    #1,D0
  941.     AND.B    #$FD,$BFE001
  942.     OR.B    D0,$BFE001
  943.     RTS    
  944.  
  945. pt_SetGlissControl
  946.     MOVE.B    n_cmdlo(A6),D0
  947.     AND.B    #$0F,D0
  948.     AND.B    #$F0,n_glissfunk(A6)
  949.     OR.B    D0,n_glissfunk(A6)
  950.     RTS
  951.  
  952. pt_SetVibratoControl
  953.     MOVE.B    n_cmdlo(A6),D0
  954.     AND.B    #$0F,D0
  955.     AND.B    #$F0,n_wavecontrol(A6)
  956.     OR.B    D0,n_wavecontrol(A6)
  957.     RTS
  958.  
  959. pt_SetFineTune
  960.     MOVE.B    n_cmdlo(A6),D0
  961.     AND.B    #$0F,D0
  962.     MOVE.B    D0,n_finetune(A6)
  963.     RTS
  964.  
  965. pt_JumpLoop
  966.     TST.L    pt_Counter
  967.     BNE.W    pt_Return
  968.     MOVE.B    n_cmdlo(A6),D0
  969.     AND.B    #$0F,D0
  970.     BEQ.B    pt_SetLoop
  971.     TST.B    n_loopcount(A6)
  972.     BEQ.B    pt_jumpcnt
  973.     SUB.B    #1,n_loopcount(A6)
  974.     BEQ.W    pt_Return
  975. pt_jmploop
  976.     MOVE.B    n_pattpos(A6),pt_PBreakPosition
  977.     ST    pt_PBreakFlag
  978.     RTS
  979.  
  980. pt_jumpcnt
  981.     MOVE.B    D0,n_loopcount(A6)
  982.     BRA.B    pt_jmploop
  983.  
  984. pt_SetLoop
  985.     MOVE.L    pt_PatternPosition,D0
  986.     LSR.L    #4,D0
  987.     AND.B    #63,D0
  988.     MOVE.B    D0,n_pattpos(A6)
  989.     RTS
  990.  
  991. pt_SetTremoloControl
  992.     MOVE.B    n_cmdlo(A6),D0
  993.     AND.B    #$0F,D0
  994.     LSL.B    #4,D0
  995.     AND.B    #$0F,n_wavecontrol(A6)
  996.     OR.B    D0,n_wavecontrol(A6)
  997.     RTS
  998.  
  999. pt_KarplusStrong
  1000.     MOVEM.L    D1-D2/A0-A1,-(SP)
  1001.     MOVE.L    n_loopstart(A6),A0
  1002.     MOVE.L    A0,A1
  1003.     MOVE.W    n_replen(A6),D0
  1004.     ADD.W    D0,D0
  1005.     SUBQ.W    #2,D0
  1006. pt_karplop
  1007.     MOVE.B    (A0),D1
  1008.     EXT.W    D1
  1009.     MOVE.B    1(A0),D2
  1010.     EXT.W    D2
  1011.     ADD.W    D1,D2
  1012.     ASR.W    #1,D2
  1013.     MOVE.B    D2,(A0)+
  1014.     DBRA    D0,pt_karplop
  1015.     MOVE.B    (A0),D1
  1016.     EXT.W    D1
  1017.     MOVE.B    (A1),D2
  1018.     EXT.W    D2
  1019.     ADD.W    D1,D2
  1020.     ASR.W    #1,D2
  1021.     MOVE.B    D2,(A0)
  1022.     MOVEM.L    (SP)+,D1-D2/A0-A1
  1023.     RTS
  1024.  
  1025. pt_RetrigNote
  1026.     MOVE.L    D1,-(SP)
  1027.     MOVEQ    #0,D0
  1028.     MOVE.B    n_cmdlo(A6),D0
  1029.     AND.B    #$0F,D0
  1030.     BEQ.W    pt_rtnend
  1031.     MOVE.L    pt_Counter,D1
  1032.     BNE.B    pt_rtnskp
  1033.     MOVE.W    n_note(A6),D1
  1034.     AND.W    #$0FFF,D1
  1035.     BNE.W    pt_rtnend
  1036.     MOVE.L    pt_Counter,D1
  1037. pt_rtnskp
  1038.     DIVU    D0,D1
  1039.     SWAP    D1
  1040.     TST.W    D1
  1041.     BNE.W    pt_rtnend
  1042. pt_DoRetrg
  1043.     MOVE.W    n_dmabit(A6),$DFF096    ;Audio DMA off
  1044.     MOVE.L    n_start(A6),(A5)    ;Set sampledata pointer
  1045.     MOVE.W    n_length(A6),4(A5)    ;Set length
  1046.     MOVE.W    n_period(A6),6(A5)
  1047.     MOVEQ    #0,D0
  1048.     MOVE.B    n_volume(A6),D0
  1049.  
  1050.     MOVE.W    pt_timeout,D0
  1051. pt_WaitDMA3
  1052.     DBRA    D0,pt_WaitDMA3
  1053.     MOVE.W    n_dmabit(A6),D0
  1054.     BSET    #15,D0
  1055.     MOVE.W    D0,$DFF096
  1056.     MOVE.W    pt_timeout,D0
  1057. pt_WaitDMA4
  1058.     DBRA    D0,pt_WaitDMA4
  1059.  
  1060.     MOVE.L    n_loopstart(A6),(A5)
  1061.     MOVE.L    n_replen(A6),4(A5)
  1062. pt_rtnend
  1063.     MOVE.L    (SP)+,D1
  1064.     RTS
  1065.  
  1066. pt_VolumeFineUp
  1067.     TST.L    pt_Counter
  1068.     BNE.W    pt_Return
  1069.     MOVEQ    #0,D0
  1070.     MOVE.B    n_cmdlo(A6),D0
  1071.     AND.B    #$F,D0
  1072.     BRA.W    pt_VolSlideUp
  1073.  
  1074. pt_VolumeFineDown
  1075.     TST.L    pt_Counter
  1076.     BNE.W    pt_Return
  1077.     MOVEQ    #0,D0
  1078.     MOVE.B    n_cmdlo(A6),D0
  1079.     AND.B    #$0F,D0
  1080.     BRA.W    pt_VolSlideDown2
  1081.  
  1082. pt_NoteCut
  1083.     MOVEQ    #0,D0
  1084.     MOVE.B    n_cmdlo(A6),D0
  1085.     AND.B    #$0F,D0
  1086.     CMP.L    pt_Counter,D0
  1087.     BNE.W    pt_Return
  1088.     CLR.B    n_volume(A6)
  1089.     RTS
  1090.  
  1091. pt_NoteDelay
  1092.     MOVEQ    #0,D0
  1093.     MOVE.B    n_cmdlo(A6),D0
  1094.     AND.B    #$0F,D0
  1095.     CMP.L    pt_Counter,D0
  1096.     BNE.W    pt_Return
  1097.     MOVE.W    (A6),D0
  1098.     AND.W    #$0FFF,D0
  1099.     BEQ.W    pt_Return
  1100.     MOVE.L    D1,-(SP)
  1101.     BRA.W    pt_DoRetrg
  1102.  
  1103. pt_PatternDelay
  1104.     TST.L    pt_Counter
  1105.     BNE.W    pt_Return
  1106.     MOVEQ    #0,D0
  1107.     MOVE.B    n_cmdlo(A6),D0
  1108.     AND.B    #$0F,D0
  1109.     TST.B    pt_PattDelayTime2
  1110.     BNE.W    pt_Return
  1111.     ADDQ.B    #1,D0
  1112.     MOVE.B    D0,pt_PattDelayTime
  1113.     RTS
  1114.  
  1115. pt_FunkIt
  1116.     TST.L    pt_Counter
  1117.     BNE.W    pt_Return
  1118.     MOVE.B    n_cmdlo(A6),D0
  1119.     AND.B    #$0F,D0
  1120.     LSL.B    #4,D0
  1121.     AND.B    #$0F,n_glissfunk(A6)
  1122.     OR.B    D0,n_glissfunk(A6)
  1123.     TST.B    D0
  1124.     BEQ.W    pt_Return
  1125. pt_UpdateFunk
  1126.     MOVEM.L    A0/D1,-(SP)
  1127.     MOVEQ    #0,D0
  1128.     MOVE.B    n_glissfunk(A6),D0
  1129.     LSR.B    #4,D0
  1130.     BEQ.B    pt_funkend
  1131.     LEA    pt_FunkTable(PC),A0
  1132.     MOVE.B    0(a0,D0.W),D0
  1133.     ADD.B    D0,n_funkoffset(A6)
  1134.     BTST    #7,n_funkoffset(A6)
  1135.     BEQ.B    pt_funkend
  1136.     CLR.B    n_funkoffset(A6)
  1137.     MOVE.L    n_loopstart(A6),D0
  1138.     MOVEQ    #0,D1
  1139.     MOVE.W    n_replen(A6),D1
  1140.     ADD.L    D1,D0
  1141.     ADD.L    D1,D0
  1142.     MOVE.L    n_wavestart(A6),A0
  1143.     ADDQ.L    #1,A0
  1144.     CMP.L    D0,A0
  1145.     BLO.B    pt_funkok
  1146.     MOVE.L    n_loopstart(A6),A0
  1147. pt_funkok
  1148.     MOVE.L    A0,n_wavestart(A6)
  1149.     MOVEQ    #-1,D0
  1150.     SUB.B    (A0),D0
  1151.     MOVE.B    D0,(A0)
  1152. pt_funkend
  1153.     MOVEM.L    (SP)+,A0/D1
  1154.     RTS
  1155.  
  1156. pt_FunkTable
  1157.     dc.b 0,5,6,7,8,10,11,13,16,19,22,26,32,43,64,128
  1158.  
  1159. pt_VibratoTable    
  1160.     dc.b 0,24,49,74,97,120,141,161
  1161.     dc.b 180,197,212,224,235,244,250,253
  1162.     dc.b 255,253,250,244,235,224,212,197
  1163.     dc.b 180,161,141,120,97,74,49,24
  1164.  
  1165. pt_PeriodTable
  1166. ; -> Tuning 0
  1167.     dc.w    856,808,762,720,678,640,604,570,538,508,480,453
  1168.     dc.w    428,404,381,360,339,320,302,285,269,254,240,226
  1169.     dc.w    214,202,190,180,170,160,151,143,135,127,120,113,0
  1170. ; -> Tuning 1
  1171.     dc.w    850,802,757,715,674,637,601,567,535,505,477,450
  1172.     dc.w    425,401,379,357,337,318,300,284,268,253,239,225
  1173.     dc.w    213,201,189,179,169,159,150,142,134,126,119,113,0
  1174. ; -> Tuning 2
  1175.     dc.w    844,796,752,709,670,632,597,563,532,502,474,447
  1176.     dc.w    422,398,376,355,335,316,298,282,266,251,237,224
  1177.     dc.w    211,199,188,177,167,158,149,141,133,125,118,112,0
  1178. ; -> Tuning 3
  1179.     dc.w    838,791,746,704,665,628,592,559,528,498,470,444
  1180.     dc.w    419,395,373,352,332,314,296,280,264,249,235,222
  1181.     dc.w    209,198,187,176,166,157,148,140,132,125,118,111,0
  1182. ; -> Tuning 4
  1183.     dc.w    832,785,741,699,660,623,588,555,524,495,467,441
  1184.     dc.w    416,392,370,350,330,312,294,278,262,247,233,220
  1185.     dc.w    208,196,185,175,165,156,147,139,131,124,117,110,0
  1186. ; -> Tuning 5
  1187.     dc.w    826,779,736,694,655,619,584,551,520,491,463,437
  1188.     dc.w    413,390,368,347,328,309,292,276,260,245,232,219
  1189.     dc.w    206,195,184,174,164,155,146,138,130,123,116,109,0
  1190. ; -> Tuning 6
  1191.     dc.w    820,774,730,689,651,614,580,547,516,487,460,434
  1192.     dc.w    410,387,365,345,325,307,290,274,258,244,230,217
  1193.     dc.w    205,193,183,172,163,154,145,137,129,122,115,109,0
  1194. ; -> Tuning 7
  1195.     dc.w    814,768,725,684,646,610,575,543,513,484,457,431
  1196.     dc.w    407,384,363,342,323,305,288,272,256,242,228,216
  1197.     dc.w    204,192,181,171,161,152,144,136,128,121,114,108,0
  1198. ; -> Tuning -8
  1199.     dc.w    907,856,808,762,720,678,640,604,570,538,508,480
  1200.     dc.w    453,428,404,381,360,339,320,302,285,269,254,240
  1201.     dc.w    226,214,202,190,180,170,160,151,143,135,127,120,0
  1202. ; -> Tuning -7
  1203.     dc.w    900,850,802,757,715,675,636,601,567,535,505,477
  1204.     dc.w    450,425,401,379,357,337,318,300,284,268,253,238
  1205.     dc.w    225,212,200,189,179,169,159,150,142,134,126,119,0
  1206. ; -> Tuning -6
  1207.     dc.w    894,844,796,752,709,670,632,597,563,532,502,474
  1208.     dc.w    447,422,398,376,355,335,316,298,282,266,251,237
  1209.     dc.w    223,211,199,188,177,167,158,149,141,133,125,118,0
  1210. ; -> Tuning -5
  1211.     dc.w    887,838,791,746,704,665,628,592,559,528,498,470
  1212.     dc.w    444,419,395,373,352,332,314,296,280,264,249,235
  1213.     dc.w    222,209,198,187,176,166,157,148,140,132,125,118,0
  1214. ; -> Tuning -4
  1215.     dc.w    881,832,785,741,699,660,623,588,555,524,494,467
  1216.     dc.w    441,416,392,370,350,330,312,294,278,262,247,233
  1217.     dc.w    220,208,196,185,175,165,156,147,139,131,123,117,0
  1218. ; -> Tuning -3
  1219.     dc.w    875,826,779,736,694,655,619,584,551,520,491,463
  1220.     dc.w    437,413,390,368,347,328,309,292,276,260,245,232
  1221.     dc.w    219,206,195,184,174,164,155,146,138,130,123,116,0
  1222. ; -> Tuning -2
  1223.     dc.w    868,820,774,730,689,651,614,580,547,516,487,460
  1224.     dc.w    434,410,387,365,345,325,307,290,274,258,244,230
  1225.     dc.w    217,205,193,183,172,163,154,145,137,129,122,115,0
  1226. ; -> Tuning -1
  1227.     dc.w    862,814,768,725,684,646,610,575,543,513,484,457
  1228.     dc.w    431,407,384,363,342,323,305,288,272,256,242,228
  1229.     dc.w    216,203,192,181,171,161,152,144,136,128,121,114,0
  1230.  
  1231. pt_audchan1temp    dc.l    0,0,0,0,0,$00010000,0,0,0,0,0
  1232. pt_audchan2temp    dc.l    0,0,0,0,0,$00020000,0,0,0,0,0
  1233. pt_audchan3temp    dc.l    0,0,0,0,0,$00040000,0,0,0,0,0
  1234. pt_audchan4temp    dc.l    0,0,0,0,0,$00080000,0,0,0,0,0
  1235.  
  1236. pt_SampleStarts    dcb.l    31,0
  1237.  
  1238. pt_timeout    dc.w    330        ;CIA-B timeout-value
  1239. pt_Counter    dc.l    0
  1240. pt_CurrSpeed    dc.l    6
  1241. pt_PattPos    dc.w    0
  1242. pt_DMACONtemp    dc.w    0
  1243. pt_PatternPtr    dc.l    0
  1244. pt_PatternPosition
  1245.         dc.l    0
  1246. pt_SongPosition    dc.l    0    
  1247. pt_SongDataPtr    dc.l    0
  1248. pt_MetroSpeed    dc.b    0
  1249. pt_MetroChannel    dc.b    0
  1250. pt_Speed    dc.b    6
  1251. pt_SongPos    dc.b    0
  1252. pt_PBreakPosition
  1253.         dc.b    0
  1254. pt_PosJumpAssert
  1255.         dc.b    0
  1256. pt_PBreakFlag    dc.b    0
  1257. pt_LowMask    dc.b    0
  1258. pt_PattDelayTime
  1259.         dc.b    0
  1260. pt_PattDelayTime2
  1261.         dc.b    0
  1262. pt_ActiveChannels
  1263.         dc.w    %1111
  1264.  
  1265.     even
  1266. _pt_Equilizers
  1267.         dc.b    0,0,0,0
  1268. _pt_Instruments
  1269.         dc.b    0,0,0,0
  1270.  
  1271.     end
  1272.